﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Xml;

namespace AccountControl
{
    class DataLoader
    {
        public static DataTable LoadAccountsDataFromXML(string XMLFileName) 
        {
            if (!File.Exists(XMLFileName))
            {
                throw new IOException("Системен файл " + XMLFileName + " липсва.");
            }

            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("No.");
            dataTable.Columns["No."].DataType = typeof(int);
            dataTable.Columns.Add("Дата");
            dataTable.Columns["Дата"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Банка");
            dataTable.Columns["Банка"].DataType = typeof(string);
            dataTable.Columns.Add("Сума");
            dataTable.Columns["Сума"].DataType = typeof(Amount);
            dataTable.Columns.Add("Период");
            dataTable.Columns["Период"].DataType = typeof(int);
            dataTable.Columns.Add("Падеж");
            dataTable.Columns["Падеж"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Собственик");
            dataTable.Columns["Собственик"].DataType = typeof(string);

            XmlTextReader XMLReader = new XmlTextReader(XMLFileName);
            int rowNum = 1;
            while (XMLReader.Read())
            {
                if (XMLReader.NodeType == XmlNodeType.Text)
                {
                    DataRow dataRow = dataTable.NewRow();
                    
                    dataRow["No."] = rowNum;
                    dataRow["Дата"] = BulgarianDate.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Банка"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Сума"] = Amount.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Период"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Падеж"] = BulgarianDate.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Собственик"] = XMLReader.Value;
                    
                    dataTable.Rows.Add(dataRow);
                    rowNum++;
                }
            }
            XMLReader.Close();

            return dataTable;
        }

        public static DataTable LoadArchiveDataFromXML(string XMLFileName)
        {
            if (!File.Exists(XMLFileName))
            {
                throw new IOException("Системен файл " + XMLFileName + " липсва.");
            }

            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("No.");
            dataTable.Columns["No."].DataType = typeof(int);
            dataTable.Columns.Add("Дата");
            dataTable.Columns["Дата"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Банка");
            dataTable.Columns["Банка"].DataType = typeof(string);
            dataTable.Columns.Add("Сума");
            dataTable.Columns["Сума"].DataType = typeof(Amount);
            dataTable.Columns.Add("Период");
            dataTable.Columns["Период"].DataType = typeof(int);
            dataTable.Columns.Add("Падеж");
            dataTable.Columns["Падеж"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Собственик");
            dataTable.Columns["Собственик"].DataType = typeof(string);
            dataTable.Columns.Add("Архивиран");
            dataTable.Columns["Архивиран"].DataType = typeof(BulgarianDate);

            XmlTextReader XMLReader = new XmlTextReader(XMLFileName);
            int rowNum = 1;
            while (XMLReader.Read())
            {
                if (XMLReader.NodeType == XmlNodeType.Text)
                {
                    DataRow dataRow = dataTable.NewRow();

                    dataRow["No."] = rowNum;
                    dataRow["Дата"] = BulgarianDate.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Банка"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Сума"] = Amount.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Период"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Падеж"] = BulgarianDate.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Собственик"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Архивиран"] = BulgarianDate.Parse(XMLReader.Value);

                    dataTable.Rows.Add(dataRow);
                    rowNum++;
                }
            }
            XMLReader.Close();

            return dataTable;
        }

        public static DataTable LoadHistoryDataFromXML(string XMLFileName)
        {
            if (!File.Exists(XMLFileName))
            {
                throw new IOException("Системен файл " + XMLFileName + " липсва.");
            }

            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("No.");
            dataTable.Columns["No."].DataType = typeof(int);
            dataTable.Columns.Add("Дата и час");
            dataTable.Columns["Дата и час"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Събитие");
            dataTable.Columns["Събитие"].DataType = typeof(string);
            dataTable.Columns.Add("Дата");
            dataTable.Columns["Дата"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Банка");
            dataTable.Columns["Банка"].DataType = typeof(string);
            dataTable.Columns.Add("Сума");
            dataTable.Columns["Сума"].DataType = typeof(Amount);
            dataTable.Columns.Add("Период");
            dataTable.Columns["Период"].DataType = typeof(int);
            dataTable.Columns.Add("Падеж");
            dataTable.Columns["Падеж"].DataType = typeof(BulgarianDate);
            dataTable.Columns.Add("Собственик");
            dataTable.Columns["Собственик"].DataType = typeof(string);

            XmlTextReader XMLReader = new XmlTextReader(XMLFileName);
            int rowNum = 1;
            while (XMLReader.Read())
            {
                if (XMLReader.NodeType == XmlNodeType.Text)
                {
                    DataRow dataRow = dataTable.NewRow();

                    dataRow["No."] = rowNum;
                    BulgarianDate dateTime = BulgarianDate.Parse(XMLReader.Value);
                    dateTime.ShowTime = true;
                    dataRow["Дата и час"] = dateTime;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Събитие"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Дата"] = BulgarianDate.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Банка"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Сума"] = Amount.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Период"] = XMLReader.Value;
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Падеж"] = BulgarianDate.Parse(XMLReader.Value);
                    XMLReader.Read();
                    XMLReader.Read();
                    XMLReader.Read();
                    dataRow["Собственик"] = XMLReader.Value;

                    dataTable.Rows.Add(dataRow);
                    rowNum++;
                }
            }
            XMLReader.Close();

            return dataTable;
        }

        public static List<string> LoadBanksDataFromXML(string XMLFileName) 
        {
            if (!File.Exists(XMLFileName))
            {
                throw new IOException("Системен файл " + XMLFileName + " липсва.");
            }

            List<string> banks = new List<string>();
            using (XmlTextReader XMLReader = new XmlTextReader(XMLFileName))
            {
                while (XMLReader.Read())
                {
                    if (XMLReader.NodeType == XmlNodeType.Text)
                    {
                        if (!banks.Contains(XMLReader.Value))
                        {
                            banks.Add(XMLReader.Value);
                        }
                    }
                }
            }

            return banks;
        }

        public static List<string> LoadCurrencyDataFromXML(string XMLFileName)
        {
            if (!File.Exists(XMLFileName))
            {
                throw new IOException("Системен файл " + XMLFileName + " липсва.");
            }

            List<string> currencyTypes = new List<string>();
            using (XmlTextReader XMLReader = new XmlTextReader(XMLFileName))
            {
                while (XMLReader.Read())
                {
                    if (XMLReader.NodeType == XmlNodeType.Text)
                    {
                        if (!currencyTypes.Contains(XMLReader.Value))
                        {
                            currencyTypes.Add(XMLReader.Value);
                        }
                    }
                }
            }

            return currencyTypes;
        }

        public static List<string> LoadOwnersDataFromXML(string XMLFileName)
        {
            if (!File.Exists(XMLFileName))
            {
                throw new IOException("Системен файл " + XMLFileName + " липсва.");
            }

            List<string> owners = new List<string>();
            using (XmlTextReader XMLReader = new XmlTextReader(XMLFileName))
            {
                while (XMLReader.Read())
                {
                    if (XMLReader.NodeType == XmlNodeType.Text)
                    {
                        if (!owners.Contains(XMLReader.Value))
                        {
                            owners.Add(XMLReader.Value);
                        }
                    }
                }
            }

            return owners;
        }
    }
}
